package com.blog.cloud.core.aspect;

import com.blog.cloud.core.annotation.SysLog;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

/**
 * 博客日志切面
 *
 * @author 龙茶清欢
 * @since 2022-11-06 12:30:55
 */
@Slf4j
@Aspect
public class SysLogAspect {

    @Around("@annotation(sysLog)")
    public Object around(ProceedingJoinPoint point, SysLog sysLog) {

        // 从切点对象那当当前的类名和方法名
        String className = point.getTarget().getClass().getName();
        String methodName = point.getSignature().getName();
        log.info("[类名] : {},[方法名] : {}",className,methodName);

        // 获取注解上的内容
        String value = sysLog.value();

        // TODO: 2022/11/7
        // 根据从注解上拿到的信息进行解析处理

        // TODO: 2022/11/7
        // 操作数据库，记入访问和操作日志
//        SysLog sysLogData = SysLogUtil.getSysLog();
        // 日志记录必须考虑异步或者使用消息队列，避免数据库压力增大
        // point.proceed() 执行切点方法，point.proceed执行前是前置增强，point.proceed执行后是后置增强
        Object obj;
        try {
            obj = point.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        } finally {
            Long endTime = System.currentTimeMillis();
            // 将信息计入到日志VO中，然后写入数据库
        }

        return obj;
    }
}
